Multithreading programming has become a common practice. Independent processing tasks may be handled in different threads that proceed in parallel to improve speed and efficiency. Different threads, however, may be synchronized whenever it is necessary. Threads in a multithreaded program may share resources such as objects. Some shared resources may be accessed only in a manner that is mutually exclusive while other resources can be shared on a non-exclusive basis.
Threads in a multithreaded program may get deadlocked if each of such threads tries to acquire one or more mutually exclusive shared resources. For example, consider a multithreaded program having a plurality of threads, including a thread T1 and a thread T2. Assume that thread T1 has acquired resource A and is waiting to acquire resource B. If at the same time, a different thread T2 has acquired resource B and is waiting to acquire resource A, thread T1 and thread T2 are deadlocked. In this case, thread T1 is deadlocked on resource B and thread T2 is deadlocked on resource A. Without detecting such a situation and resolving the deadlock, neither thread T1 nor thread T2 can proceed. As a result, the entire multithreaded program may stall.